package com;

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

public class Reflect_05 {
	public static void main(String[] args) throws Exception {
//		test1();
		test2();
	}

	/**
	 * 获取所有的构造方法
	 * 
	 * @throws Exception
	 */
	public static void test1() throws Exception {

		Class c = Class.forName("java.lang.String");
		// 获取所有的构造方法
		Constructor[] cs = c.getConstructors();

		for (Constructor constructor : cs) {
			// 修饰符
			System.out.println(Modifier.toString(constructor.getModifiers()) + " ");

			// 方法名
			// 方法名没有简称
//			System.out.print(constructor.getName() + " ( ");
			// 但是方法名就是列名,可以使用类名获取简称
			System.out.print(c.getSimpleName() + " ( ");

			// 参数列表
			Class[] parametersTypes = constructor.getParameterTypes();
			for (Class parametersType : parametersTypes) {
				System.out.print(parametersType.getSimpleName() + " , ");
			}
			System.out.println(" ) ");
		}
	}

	public static void test2() throws Exception {

		Class c = Class.forName("com.Customer");
		// 报错 因为没有无参构造,newInstance 是调用的无参的构造方法,是 Class 调用的
//		Object o = c.newInstance();
		// java.lang.InstantiationException: com.Customer

		// 获取指定的构造方法
		Constructor constructor = c.getDeclaredConstructor(int.class);
		constructor.setAccessible(true);
		// newInstance : 是 Constructor 对象调用的
		Object object = constructor.newInstance(123);
		System.out.println(object);
	}
}

class Customer {
	private int id;

	private Customer(int id) {
		super();
		this.id = id;
	}

	@Override
	public String toString() {
		return "Customer [id=" + id + "]";
	}

}
